package com.wtgroup.demo.leetcode.q027;

import com.wtgroup.demo.common.util.Tools;

/**
 * LC M2 修改:
 * "请注意，被交换的最后一个元素可能是您想要移除的值。但是不要担心，在下一次迭代中，我们仍然会检查这个元素。" 他i没动, 下次还会判断到.
 * 但, 如果后面等值元素个数太多了的话, 有点浪费.
 *
 * @author dafei
 * @version 0.1
 * @date 2021/4/7 11:56
 */
public class Q027_M2 {

    public static void main(String[] args) {
        int[][] inputs = {
                {3, 2, 2, 3},
                {0, 1, 2, 2, 3, 0, 4, 2},
                {1}
        };
        int[] vals = {3, 2, 1};
        Q027_M2 exe = new Q027_M2();
        for (int i = 0; i < inputs.length; i++) {
            int[] input = inputs[i];
            int res = exe.removeElement(input, vals[i]);
            System.out.println(res);
            System.out.print("[");
            for (int j = 0; j < res; j++) {
                System.out.print(input[j] + (j<res-1 ? ",": ""));
            }
            System.out.println("]");
        }
    }

    /**
     * LC M2 修改:
     * "请注意，被交换的最后一个元素可能是您想要移除的值。但是不要担心，在下一次迭代中，我们仍然会检查这个元素。" 他i没动, 下次还会判断到.
     * 但, 如果后面等值元素个数太多了的话, 有点浪费.
     */
    public int removeElement(int[] nums, int val) {

        int i = 0, j = nums.length - 1;
        while (i <= j) { // 包含'=', i 位置不用管是否等于值了
            if (nums[i] == val) {
                while (j > i && nums[j] == val) {
                    j--;
                }
                if (j > i) {
                    nums[i] = nums[i] ^ nums[j];
                    nums[j] = nums[i] ^ nums[j];
                    nums[i] = nums[i] ^ nums[j];
                }
                --j;
            }
            i++;
        }

        return j+1; // !! i 不行
    }

}
